using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using ADL;
using ADL.BodegaTableAdapters;
using AEL.BOD;
using BEL;

namespace CEL.BOD
{
    /// <summary>
    /// Acceso a la base de datos
    /// Modulo:Bodega tar
    /// Tabla:Bod_Alta
    /// </summary>
    public class DO_Bod_Alta
    {
        #region Adapter

        private Bod_AltaTableAdapter _Adapter;

        /// <summary>
        /// Acceso al Table Adapter de la capa ADL
        /// </summary>
        public Bod_AltaTableAdapter Adapter
        {
            get
            {
                if (_Adapter == null)
                    _Adapter = new Bod_AltaTableAdapter();
                return _Adapter;
            }
        }

        #endregion

        #region Obtención de datos

        //Obtencion de datos
        /// <summary>
        /// Obtiene todos los datos de la tabla Bod_Alta
        /// </summary> 
        /// <returns>Lista de objetos Bod_Alta</returns> 
        public List<Bod_Alta> Get(Scope s)
        {
            string llamada = "";
            List<Bod_Alta> lista = new List<Bod_Alta>();
            //Extrae los datos
            if (s != null)
            {
                Bodega.Bod_AltaDataTable tabla =
                    Adapter.Get(s.Ver_Version_Id);
                //Cuenta  el número  de registros de la tabla
                int numeroRegistros = tabla.Count;
                llamada = "Nombre del Método Utilizado: Get " + "Parametros  Enviados en el Método: s " +
                          " Nombre del Store Procedure: " + " Bod_Alta_Get " + " Número de Registros: " +
                          numeroRegistros;
                //Carga en la lista
                foreach (Bodega.Bod_AltaRow fila in tabla)
                    lista.Add(new Bod_Alta(
                                  fila.Id,
                                  fila.Codigo,
                                  fila.Estado,
                                  fila.Bod_Bodega_Id,
                                  fila.Int_Sucursal_Id,
                                  fila.Int_Moneda_Id,
                                  fila.Fecha,
                                  fila.Fecha_Creacion,
                                  fila.Creacion_Per_Personal_Id,
                                  fila.Fecha_Update,
                                  fila.Update_Per_Personal_Id,
                                  fila.Bod_Alta_Motivo_Id,
                                  fila.Descripcion,
                                  fila.Bod_Bodega_Codigo,
                                  fila.Bod_Bodega_Nombre,
                                  fila.Int_Sucursal_Codigo,
                                  fila.Int_Sucursal_Nombre,
                                  fila.Int_Empresa_Id,
                                  fila.Int_Empresa_Codigo,
                                  fila.Int_Empresa_Nombre,
                                  fila.Creacion_Per_Personal_Codigo,
                                  fila.Creacion_Per_Personal_Nombre,
                                  fila.Update_Per_Personal_Codigo,
                                  fila.Update_Per_Personal_Nombre,
                                  fila.Bod_Alta_Motivo_Codigo,
                                  fila.Bod_Alta_Motivo_Nombre,
                                  fila.Estado_Nombre,
                                  fila.int_moneda_codigo,
                                  fila.int_moneda_nombre));
            }
            //Devuleve la Lista
            return lista;
        }

        public List<Bod_Alta> GetByCodigo(Scope s, string Codigo)
        {
            string llamada = "";
            List<Bod_Alta> lista = new List<Bod_Alta>();
            //Extrae los datos
            if (s != null)
            {
                Bodega.Bod_AltaDataTable tabla =
                    Adapter.GetByCodigo(s.Ver_Version_Id, Codigo);
                //Cuenta  el número  de registros de la tabla
                int numeroRegistros = tabla.Count;
                llamada = "Nombre del Método Utilizado: " + " GetByCodigo" + " Parametros  Enviados en el Método: " +
                          "," + " s.Ver_Version_Id : " + s.Ver_Version_Id + "," + " Codigo : " + Codigo +
                          " Nombre del Store Procedure: " + "dbo.Bod_Alta_ByCodigo " + " Número de Registros: " +
                          numeroRegistros;
                //Carga en la lista
                foreach (Bodega.Bod_AltaRow fila in tabla)
                    lista.Add(new Bod_Alta(
                                  fila.Id,
                                  fila.Codigo,
                                  fila.Estado,
                                  fila.Bod_Bodega_Id,
                                  fila.Int_Sucursal_Id,
                                  fila.Int_Moneda_Id,
                                  fila.Fecha,
                                  fila.Fecha_Creacion,
                                  fila.Creacion_Per_Personal_Id,
                                  fila.Fecha_Update,
                                  fila.Update_Per_Personal_Id,
                                  fila.Bod_Alta_Motivo_Id,
                                  fila.Descripcion,
                                  fila.Bod_Bodega_Codigo,
                                  fila.Bod_Bodega_Nombre,
                                  fila.Int_Sucursal_Codigo,
                                  fila.Int_Sucursal_Nombre,
                                  fila.Int_Empresa_Id,
                                  fila.Int_Empresa_Codigo,
                                  fila.Int_Empresa_Nombre,
                                  fila.Creacion_Per_Personal_Codigo,
                                  fila.Creacion_Per_Personal_Nombre,
                                  fila.Update_Per_Personal_Codigo,
                                  fila.Update_Per_Personal_Nombre,
                                  fila.Bod_Alta_Motivo_Codigo,
                                  fila.Bod_Alta_Motivo_Nombre,
                                  fila.Estado_Nombre,
                                  fila.int_moneda_codigo,
                                  fila.int_moneda_nombre));
            }
            //Realiza la auditoria
            Auditar.Registro(s, llamada, lista, Textos._AUDITAR_ACCION_SELECT_SEL);
            //Devuleve la Lista
            return lista;
        }

        public List<Bod_Alta> GetByEmpresa(Scope s)
        {
            string llamada = "";
            List<Bod_Alta> lista = new List<Bod_Alta>();
            //Extrae los datos
            if (s != null)
            {
                Bodega.Bod_AltaDataTable tabla =
                    Adapter.GetByEmpresa(s.Ver_Version_Id, s.Per_Personal_Id, s.Int_Empresa_Id);
                //Cuenta  el número  de registros de la tabla
                int numeroRegistros = tabla.Count;
                llamada = "Nombre del Método Utilizado: " + " GetByEmpresa" + " Parametros  Enviados en el Método: " +
                          "," + " s.Ver_Version_Id : " + s.Ver_Version_Id + "," + " Per_Personal_Id : " +
                          s.Per_Personal_Id + "," + " Int_Empresa_Id : " + s.Int_Empresa_Id +
                          " Nombre del Store Procedure: " + "dbo.Bod_Alta_ByEmpresa " + " Número de Registros: " +
                          numeroRegistros;
                //Carga en la lista
                foreach (Bodega.Bod_AltaRow fila in tabla)
                    lista.Add(new Bod_Alta(
                                  fila.Id,
                                  fila.Codigo,
                                  fila.Estado,
                                  fila.Bod_Bodega_Id,
                                  fila.Int_Sucursal_Id,
                                  fila.Int_Moneda_Id,
                                  fila.Fecha,
                                  fila.Fecha_Creacion,
                                  fila.Creacion_Per_Personal_Id,
                                  fila.Fecha_Update,
                                  fila.Update_Per_Personal_Id,
                                  fila.Bod_Alta_Motivo_Id,
                                  fila.Descripcion,
                                  fila.Bod_Bodega_Codigo,
                                  fila.Bod_Bodega_Nombre,
                                  fila.Int_Sucursal_Codigo,
                                  fila.Int_Sucursal_Nombre,
                                  fila.Int_Empresa_Id,
                                  fila.Int_Empresa_Codigo,
                                  fila.Int_Empresa_Nombre,
                                  fila.Creacion_Per_Personal_Codigo,
                                  fila.Creacion_Per_Personal_Nombre,
                                  fila.Update_Per_Personal_Codigo,
                                  fila.Update_Per_Personal_Nombre,
                                  fila.Bod_Alta_Motivo_Codigo,
                                  fila.Bod_Alta_Motivo_Nombre,
                                  fila.Estado_Nombre,
                                  fila.int_moneda_codigo,
                                  fila.int_moneda_nombre));
            }
            //Realiza la auditoria
            Auditar.Registro(s, llamada, lista, Textos._AUDITAR_ACCION_SELECT_SEL);
            //Devuleve la Lista
            return lista;
        }

        public List<Bod_Alta> GetById(Scope s, string Id)
        {
            string llamada = "";
            List<Bod_Alta> lista = new List<Bod_Alta>();
            //Extrae los datos
            if (s != null)
            {
                Bodega.Bod_AltaDataTable tabla =
                    Adapter.GetById(s.Ver_Version_Id, Id);
                //Cuenta  el número  de registros de la tabla
                int numeroRegistros = tabla.Count;
                llamada = "Nombre del Método Utilizado: " + " GetById" + " Parametros  Enviados en el Método: " + "," +
                          " s.Ver_Version_Id : " + s.Ver_Version_Id + "," + " Id : " + Id +
                          " Nombre del Store Procedure: " + "dbo.Bod_Alta_ById " + " Número de Registros: " +
                          numeroRegistros;
                //Carga en la lista
                foreach (Bodega.Bod_AltaRow fila in tabla)
                    lista.Add(new Bod_Alta(
                                  fila.Id,
                                  fila.Codigo,
                                  fila.Estado,
                                  fila.Bod_Bodega_Id,
                                  fila.Int_Sucursal_Id,
                                  fila.Int_Moneda_Id,
                                  fila.Fecha,
                                  fila.Fecha_Creacion,
                                  fila.Creacion_Per_Personal_Id,
                                  fila.Fecha_Update,
                                  fila.Update_Per_Personal_Id,
                                  fila.Bod_Alta_Motivo_Id,
                                  fila.Descripcion,
                                  fila.Bod_Bodega_Codigo,
                                  fila.Bod_Bodega_Nombre,
                                  fila.Int_Sucursal_Codigo,
                                  fila.Int_Sucursal_Nombre,
                                  fila.Int_Empresa_Id,
                                  fila.Int_Empresa_Codigo,
                                  fila.Int_Empresa_Nombre,
                                  fila.Creacion_Per_Personal_Codigo,
                                  fila.Creacion_Per_Personal_Nombre,
                                  fila.Update_Per_Personal_Codigo,
                                  fila.Update_Per_Personal_Nombre,
                                  fila.Bod_Alta_Motivo_Codigo,
                                  fila.Bod_Alta_Motivo_Nombre,
                                  fila.Estado_Nombre,
                                  fila.int_moneda_codigo,
                                  fila.int_moneda_nombre));
            }
            //Realiza la auditoria
            Auditar.Registro(s, llamada, lista, Textos._AUDITAR_ACCION_SELECT_SEL);
            //Devuleve la Lista
            return lista;
        }
        public List<Bod_Alta> GetByEstado(Scope s, string Estado,string Bod_Bodega_Nombre, DateTime Fecha_Inicio, DateTime Fecha_Final)
          {
          string llamada = "";
          List <Bod_Alta> lista= new List <Bod_Alta> ();
          //Extrae los datos
          if(s != null)
          {
          Bodega.Bod_AltaDataTable tabla = 
          Adapter.GetByEstado(s.Ver_Version_Id, Estado, Bod_Bodega_Nombre, Fecha_Inicio, Fecha_Final);
          //Cuenta  el número  de registros de la tabla
          int numeroRegistros = tabla.Count;
          llamada = "Nombre del Método Utilizado: " + " GetByEstado" + " Parametros  Enviados en el Método: "+ "," + " s.Ver_Version_Id : " + s.Ver_Version_Id+ "," + " Estado : " + Estado  + " Nombre del Store Procedure: " + "dbo.Bod_Alta_ByEstado " + " Número de Registros: " + numeroRegistros;
          //Carga en la lista
          foreach (Bodega.Bod_AltaRow fila in tabla)
          lista.Add(new Bod_Alta(
          
    fila.Id,
    fila.Codigo,
    fila.Estado,
    fila.Bod_Bodega_Id,
    fila.Int_Sucursal_Id,
    fila.Int_Moneda_Id,
    fila.Fecha,
    fila.Fecha_Creacion,
    fila.Creacion_Per_Personal_Id,
    fila.Fecha_Update,
    fila.Update_Per_Personal_Id,
    fila.Bod_Alta_Motivo_Id,
    fila.Descripcion,
    fila.Bod_Bodega_Codigo,
    fila.Bod_Bodega_Nombre,
    fila.Int_Sucursal_Codigo,
    fila.Int_Sucursal_Nombre,
    fila.Int_Empresa_Id,
    fila.Int_Empresa_Codigo,
    fila.Int_Empresa_Nombre,
    fila.Creacion_Per_Personal_Codigo,
    fila.Creacion_Per_Personal_Nombre,
    fila.Update_Per_Personal_Codigo,
    fila.Update_Per_Personal_Nombre,
    fila.Bod_Alta_Motivo_Codigo,
    fila.Bod_Alta_Motivo_Nombre,
    fila.Estado_Nombre,
    fila.int_moneda_codigo,
    fila.int_moneda_nombre));
          }
          //Realiza la auditoria
          Auditar.Registro(s, llamada, lista, Textos._AUDITAR_ACCION_SELECT_SEL);
          //Devuleve la Lista
          return lista;
          }
        #endregion

        #region Operaciones con datos

        //Inserta
        /// <summary>
        /// Inserta el objeto en la tabla Bod_Alta
        /// </summary>
        /// <param name="s">Variables de ámbito como la versión y la sucursal</param>
        // <returns></returns>
        public string Insert(Scope s, Bod_Alta o)
        {
            // Genera un nuevo Id, codigo y estado.
            o.GenNewId(s.Int_Sucursal_Numero);
            o.GenCodigo(s.Ver_Version_Id);
            //o.GenEstado();
            o.Estado = "PEN";
            // Controla el error de clave primaria duplicada.
            o.Int_Sucursal_Id = s.Int_Sucursal_Id;
            o.Creacion_Per_Personal_Id = s.Per_Personal_Id;
            o.Update_Per_Personal_Id = s.Per_Personal_Id;
            o.Fecha_Creacion = DateTime.Now;
            o.Fecha_Update = DateTime.Now;
            try
            {
                Adapter.Insert(
                    o.Id,
                    o.Codigo,
                    o.Bod_Bodega_Id,
                    o.Int_Sucursal_Id,
                    o.Int_Moneda_Id,
                    o.Fecha,
                    o.Fecha_Creacion,
                    o.Creacion_Per_Personal_Id,
                    o.Fecha_Update,
                    o.Update_Per_Personal_Id,
                    o.Bod_Alta_Motivo_Id,
                    o.Descripcion,
                    o.Estado);
            }
            catch (SqlException e)
            {
                Exception eCaso;
                Exception otroEX;
                switch (e.Number)
                {
                        // Si el error es de violación PK, entonces repite.
                    case 2627:
                        string mensaje = e.Errors[0].Message;
                        if (mensaje.StartsWith(
                            Textos._ERR_VIOLATION_UNIQUE_KEY)
                            )
                            return Insert(s, o);
                        else
                        {
                            if (e.Message.Contains(TXT_BDD._IX_Bod_Alta_Codigo))
                            {
                                eCaso = new Exception("");
                                otroEX = new Exception(TXT_Mensajes._MSJ32, eCaso);
                                throw (otroEX);
                            }
                            eCaso = new Exception(e.Message);
                            otroEX = new Exception(TXT_Mensajes._MSJ34, eCaso);
                            throw (otroEX);
                        }
                        break;
                    default:
                        eCaso = new Exception(e.Message);
                        otroEX = new Exception(TXT_Mensajes._MSJ34, eCaso);
                        throw (otroEX);
                }
            }
            //Control de Auditoria
            Auditar.Registro(s, o, Textos._AUDITAR_ACCION_INSERT);
            //Retorna el Id Insetado
            return o.Id;
        }

        // Borra
        /// <summary>
        /// Borra el objeto de la tabla Bod_Alta
        ///</summary>
        /// <param name="o">Objeto a actualizar</param>
        /// <returns></returns>
        public int Delete(Scope s, Bod_Alta o)
        {
            int resultado = 0;
            try
            {
                resultado = Adapter.Delete(
                    o.Id,
                    o.Codigo,
                    o.Bod_Bodega_Id,
                    o.Int_Sucursal_Id,
                    o.Int_Moneda_Id,
                    o.Fecha,
                    o.Fecha_Creacion,
                    o.Creacion_Per_Personal_Id,
                    o.Fecha_Update,
                    o.Update_Per_Personal_Id,
                    o.Bod_Alta_Motivo_Id,
                    o.Descripcion,
                    o.Estado);
            }
            catch (SqlException e)
            {
                Exception eCaso;
                Exception otroEX;

                eCaso = new Exception(e.Message);
                otroEX = new Exception(TXT_Mensajes._MSJ34, eCaso);
                throw (otroEX);
            }
            Auditar.Registro(s, o, Textos._AUDITAR_ACCION_DELETE);
            return resultado;
        } //Actualiza
        /// <summary>
        //Actualiza la tabla Bod_Alta
        /// </summary>
        /// <param name="o">Objeto que contiene la información a actualizar</param>
        /// <param name="original">Original para concurrencia optimista</param> 
        /// <returns></returns>
        public int Update(Scope s, Bod_Alta o, Bod_Alta original)
        {
            int resultado = 0;
            o.Update_Per_Personal_Id = s.Per_Personal_Id;
            o.Fecha_Update = DateTime.Now;
            try
            {
                resultado = Adapter.Update(
                    o.Id,
                    o.Codigo,
                    o.Bod_Bodega_Id,
                    o.Int_Sucursal_Id,
                    o.Int_Moneda_Id,
                    o.Fecha,
                    o.Fecha_Creacion,
                    o.Creacion_Per_Personal_Id,
                    o.Fecha_Update,
                    o.Update_Per_Personal_Id,
                    o.Bod_Alta_Motivo_Id,
                    o.Descripcion,
                    o.Estado,
                    original.Id,
                    original.Codigo,
                    original.Bod_Bodega_Id,
                    original.Int_Sucursal_Id,
                    original.Int_Moneda_Id,
                    original.Fecha,
                    original.Fecha_Creacion,
                    original.Creacion_Per_Personal_Id,
                    original.Fecha_Update,
                    original.Update_Per_Personal_Id,
                    original.Bod_Alta_Motivo_Id,
                    original.Descripcion,
                    original.Estado);
            }
            catch (SqlException e)
            {
                Exception eCaso;
                Exception otroEX;

                if (e.Message.Contains(TXT_BDD._IX_Bod_Alta_Codigo))
                {
                    eCaso = new Exception("");
                    otroEX = new Exception(TXT_Mensajes._MSJ32, eCaso);
                    throw (otroEX);
                }
                eCaso = new Exception(e.Message);
                otroEX = new Exception(TXT_Mensajes._MSJ34, eCaso);
                throw (otroEX);
            }

            Auditar.Registro(s, o, Textos._AUDITAR_ACCION_UPDATE);
            return resultado;
        }

        #endregion
    }
}